{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LASSO and Ridge Regression\n",
    "\n",
    "This function shows how to use TensorFlow to solve lasso or ridge regression for $\\boldsymbol{y} = \\boldsymbol{Ax} + \\boldsymbol{b}$\n",
    "\n",
    "We will use the iris data, specifically: $\\boldsymbol{y}$ = Sepal Length, $\\boldsymbol{x}$ = Petal Width"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# import required libraries\n",
    "import matplotlib.pyplot as plt\n",
    "import sys\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from sklearn import datasets\n",
    "from tensorflow.python.framework import ops"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Specify 'Ridge' or 'LASSO'\n",
    "regression_type = 'LASSO'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# clear out old graph\n",
    "ops.reset_default_graph()\n",
    "\n",
    "# Create graph\n",
    "sess = tf.Session()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load iris data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)]\n",
    "iris = datasets.load_iris()\n",
    "x_vals = np.array([x[3] for x in iris.data])\n",
    "y_vals = np.array([y[0] for y in iris.data])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model Parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Declare batch size\n",
    "batch_size = 50\n",
    "\n",
    "# Initialize placeholders\n",
    "x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)\n",
    "y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)\n",
    "\n",
    "# make results reproducible\n",
    "seed = 13\n",
    "np.random.seed(seed)\n",
    "tf.set_random_seed(seed)\n",
    "\n",
    "# Create variables for linear regression\n",
    "A = tf.Variable(tf.random_normal(shape=[1,1]))\n",
    "b = tf.Variable(tf.random_normal(shape=[1,1]))\n",
    "\n",
    "# Declare model operations\n",
    "model_output = tf.add(tf.matmul(x_data, A), b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Loss Functions\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Select appropriate loss function based on regression type\n",
    "\n",
    "if regression_type == 'LASSO':\n",
    "    # Declare Lasso loss function\n",
    "    # Lasso Loss = L2_Loss + heavyside_step,\n",
    "    # Where heavyside_step ~ 0 if A < constant, otherwise ~ 99\n",
    "    lasso_param = tf.constant(0.9)\n",
    "    heavyside_step = tf.truediv(1., tf.add(1., tf.exp(tf.multiply(-50., tf.subtract(A, lasso_param)))))\n",
    "    regularization_param = tf.multiply(heavyside_step, 99.)\n",
    "    loss = tf.add(tf.reduce_mean(tf.square(y_target - model_output)), regularization_param)\n",
    "\n",
    "elif regression_type == 'Ridge':\n",
    "    # Declare the Ridge loss function\n",
    "    # Ridge loss = L2_loss + L2 norm of slope\n",
    "    ridge_param = tf.constant(1.)\n",
    "    ridge_loss = tf.reduce_mean(tf.square(A))\n",
    "    loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target - model_output)), tf.multiply(ridge_param, ridge_loss)), 0)\n",
    "    \n",
    "else:\n",
    "    print('Invalid regression_type parameter value',file=sys.stderr)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Optimizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Declare optimizer\n",
    "my_opt = tf.train.GradientDescentOptimizer(0.001)\n",
    "train_step = my_opt.minimize(loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Run regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Step #300 A = [[ 0.77170753]] b = [[ 1.82499862]]\n",
      "Loss = [[ 10.26473045]]\n",
      "\n",
      "\n",
      "Step #600 A = [[ 0.75908542]] b = [[ 3.2220633]]\n",
      "Loss = [[ 3.06292033]]\n",
      "\n",
      "\n",
      "Step #900 A = [[ 0.74843585]] b = [[ 3.9975822]]\n",
      "Loss = [[ 1.23220456]]\n",
      "\n",
      "\n",
      "Step #1200 A = [[ 0.73752165]] b = [[ 4.42974091]]\n",
      "Loss = [[ 0.57872057]]\n",
      "\n",
      "\n",
      "Step #1500 A = [[ 0.72942668]] b = [[ 4.67253113]]\n",
      "Loss = [[ 0.40874988]]\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Initialize variables\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)\n",
    "\n",
    "# Training loop\n",
    "loss_vec = []\n",
    "for i in range(1500):\n",
    "    rand_index = np.random.choice(len(x_vals), size=batch_size)\n",
    "    rand_x = np.transpose([x_vals[rand_index]])\n",
    "    rand_y = np.transpose([y_vals[rand_index]])\n",
    "    sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "    temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "    loss_vec.append(temp_loss[0])\n",
    "    if (i+1)%300==0:\n",
    "        print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)) + ' b = ' + str(sess.run(b)))\n",
    "        print('Loss = ' + str(temp_loss))\n",
    "        print('\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extract regression results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Get the optimal coefficients\n",
    "[slope] = sess.run(A)\n",
    "[y_intercept] = sess.run(b)\n",
    "\n",
    "# Get best fit line\n",
    "best_fit = []\n",
    "for i in x_vals:\n",
    "  best_fit.append(slope*i+y_intercept)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nishmj32tW8fnONt5Ds5f5nWOxPlC/wTn8skW4I4MVvEznMHuBe7x+BfQzV338ziX/ea4bebEvPe7\nwK0ishNncPoJj+v+N87gfvS9HPPcZclSUUfhXPr5L85Z6AMxr98CPOReEvsfTGiIc4nVmPSJiAJd\nVXVNrvvilTipsxuBYar6Uqr2xhQbO1MwBU9EBotIuYgcipNqKxy4VGaMiWJBwRSDAcBanEHbbwCV\n7vVyY0wMu3xkjDEmws4UjDHGRGSlZG6QWrVqpR07dsx1N4wxJq8sXrx4s6q2TtUu74JCx44dWbRo\nUa67YYwxeUVE0rmr3N/LRyLyIxF5S0TeFJGpItIk5nURkbtFZI2IvCEiffzsjzHGmOR8Cwru3aw3\nAn1VtQdOkawrY5qdh1NkqyswArjXr/4YY4xJze+B5kOAMre8wGEcqI9T52LgYXUsAMolh7NNGWNM\nsfNtTEFVq0XkTuADnHIFs1R1VkyzCupXUtzoLvsoupGIjMA5k6BDh4Prau3du5eNGzeyZ8+e7G2A\nSapJkya0a9eO0tLSXHfFGJNFvgUFd3KMi4FOODXinxSRq1T1Ua+fpapTgCkAffv2PejGio0bN9K0\naVM6duyIUwTT+ElV2bJlCxs3bqRTp0657o4xJov8vHx0Ds5EIDWquhenYNipMW2qqV9et527zJM9\ne/bQsmVLCwgBERFatmxpZ2YmMFVLqxk4YQ6dxkxn4IQ5VC31/DVh0uRnUPgAOMUtnSvA2cDKmDbP\nAte4WUinANtV9aPYD0qHBYRg2f42QalaWs3YZ1ZQvW03ClRv283YZ1ZYYPCJb0FBVRfizI27BFjh\nrmuKiIwUkZFusxnAOpySv3/BKfNrjDERd8xcze69tfWW7d5byx0zV+eoR4XN1+wjVb1ZVY9V1R6q\nerWqfq6qk1V1svu6qur3VLWLqvZU1by9K62kpIRevXpx/PHHc+KJJ/K73/2O/fuTz6eyfv16/va3\nvyVtk2xdPXr04PLLL2fXrl1J2596auxVu4PdddddKT/HmFz4cFv82oWJlpuGKcraR35cnywrK2PZ\nsmW89dZbzJ49m+eff55f/vKXSd+TaVCoW9ebb75J48aNmTx5ctL2r776atLXwYKCCa+25WWelpuG\nKbqgEMT1yTZt2jBlyhQmTZqEqrJ+/XpOP/10+vTpQ58+fSJf0mPGjGHevHn06tWLiRMnJmyXzOmn\n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\nBg4b4aUjxG0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x117375208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nx8JFF11Uafk111zDYYcdRs+ePWnTpk2KoxKRdJXMy0efAv4L7GVmi8zsIuAe4Ggzmw0cFc7LDjZq\n1CgmTZpUdhlpVf71r3+lKCIRSWdJ6xpy9zOrqBqYrH3Kj376058CsHnzZiZOnMhhhx221TLnnXce\nLVu2pGHDhuyxxx7sueeebNq0iTlz5rDPPvukOmQRiYiGmKjnGjRowL777ltl/dChQ8umJ06cyKhR\no/jnP/9Jfn4+7du3T0WIIhIxJYIYaNasWa2WO+CAA8paAsuWLSMjI4N27aq8wldE6gklghgws7LB\n6kpKSnB3GjRoUOmy06dPB2C//fYDgnsQdHWRSP2mRBATZgZAZmYmAPfddx8bNmyge/funHXWWVWu\n16ZNG5YvX05+fj4NGjSge/fuZdsQkfpBiSCmrr32WgCWLFnCueeeW+0VRIl3MN99993cdNNNSY9P\nRFJHw1DH3K677srjjz/Ogw8+WKvlR4wYAQRDX//www/JDE1EUkSJQAC4/PLLcXc+++wzLrroIq68\n8kpOOeWUrZbLz8+nT58+5OTk0KZNG2655Ra+/vprli5diruzdu3aCKIXke2R1NFHdxSNPhqd9evX\n079//xpvTgM488wzeeqpp1i8eDG77rorCxcuBKBTp07JDlNEKpGuo4/KTqZZs2ZMnjy5Vss+9dRT\nAEyaNIkOHTrQuXNnOnfunMzwRGQHUCKQWikoKODee++t1bKDBw8uG+gOgiEvli5dysyZM7n77rvL\nPXdZRKKnRCC1kpuby7XXXsv111/PN998U3YfwtNPP03v3r2rXffiiy9m11135cQTT+Tmm2/m0ksv\n5f33309F2CJSCzpHINtkw4YNzJ07t2z4irFjx3LOOefUaRvfffcd/fr145133tHYRiJJoHMEklRN\nmzYtN4bR2WefzZ133skll1xC3759ufzyywHYa6+qn0T6xBNPUFBQwF133cUbb7yBmbF8+fKkxy4i\n5alFIEn15Zdflo2EWltvvvkmxxxzTJIiEokPtQgkLXTp0qVsukePHkycOJHHHnus2nUGDRrEhRde\nyIgRIzAz/vznP7Nu3bpkhyoSW2oRSNJt2LCBJk2alI13BJSbrq2nn36aU089leXLl/PVV19x7rnn\n8uijj3L00Udr/CORSqhFIGmjadOmWx3458+fT//+/Zk6dSp33XUXELQYqnPGGWeQmZlJu3btOOqo\no1i8eDHHHXcce+21F4888ghHHHEE//jHP5L2PkTqK7UIJG1s2rSJq666iqFDh3LyySeTkZHBl19+\nWe0J58pcddVVnHbaacyePZvzzjuPjIzg9868efNo1KhR2QN3VqxYoWc3S71W2xaBEoGkvcmTJ9Oj\nRw+GDx/OH//4xzqvP2TIEObPn8/UqVMBOOGEE3jggQfYY489GDFiBFdcccWODlkkLSgRSL3j7tx2\n222cfvrplJSUMHnyZO644w5mz5693ds+8sgjOf/888nLy2PhwoX8/e9/p2XLlrRo0QIIWhMdOnSg\nYcOG270vkVRRIpBYadGiBevWrWPNmjVcccUV1T5foS66detGz549ee211wB4/fXXad++Pfvttx+L\nFy8mLy+PE088kdWrV3PzzTdzzz33lCUPkagpEUiszJs3jylTpnDSSSdRUlLCihUraNu2LcXFxXTt\n2pXBgwczdOhQXnjhBUaNGrXd+7vhhhvKxl4aPnw4+fn53HfffQBMmTKlxmE3RFJBiUCkEsXFxSxY\nsIBFixbxxRdfMH78eN59913+9re/sXz5cu644w4AdtttN77//vsdss/BgwdzzDHHMH/+fIYPH85P\nfvITpk+fvtWVVO5OUVERmZmZZSe4RbaHEoHINhg9ejTdunXjiCOOoKCggIsvvpjx48fz0EMPUVxc\nnLQTy7vssgsFBQUAZGdns3nzZl566SVGjhzJa6+9xtixYznssMNYtWoV8+fP5+ijj2bx4sVkZWXR\ntWvXKrf74YcfMnr0aEaNGrVN927Izq22iQB3T/tX3759XSRdrF692v/2t7/5tGnTfMGCBd6/f38H\nInv16tWrbHrs2LE+aNAg/+CDD3zatGll5RdffLEvXLjQi4uLfcSIEX7mmWd6UVGRb9q0ybds2eK3\n3HKLL1mypNr3/corr/gHH3zgy5YtS9EnLdsLyPNaHGPVIhDZAVauXEmjRo348MMPycjIYPr06dxw\nww288847fPjhhwwePJiCgoKybqj169cD0LlzZ7Zs2VLu+Q1RO/XUU8nLyyMjI4MLLriAmTNnMmDA\nAH71q1+VLXPNNddw5plnsv/++5ORkcGsWbPo2bNnldssKSnh+eefp2/fvnTr1g0IuukyMjIwM+bN\nm8dLL73E1VdfnbSWi7vHrlWU1i0C4FhgFjAHuKmm5dUikPqmuLi43PS4ceO8qKjI3d3z8/N96tSp\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1176528d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "# Plot the result\n",
    "plt.plot(x_vals, y_vals, 'o', label='Data Points')\n",
    "plt.plot(x_vals, best_fit, 'r-', label='Best fit line', linewidth=3)\n",
    "plt.legend(loc='upper left')\n",
    "plt.title('Sepal Length vs Pedal Width')\n",
    "plt.xlabel('Pedal Width')\n",
    "plt.ylabel('Sepal Length')\n",
    "plt.show()\n",
    "\n",
    "# Plot loss over time\n",
    "plt.plot(loss_vec, 'k-')\n",
    "plt.title(regression_type + ' Loss per Generation')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('Loss')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:tf-cpu]",
   "language": "python",
   "name": "conda-env-tf-cpu-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
